#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""
interlock.py - 联锁状态监控模块

该模块实现了对联锁状态的监控功能，包括：
1. 联锁状态检测
2. 状态变化回调
3. 连接状态监控
4. 日志记录
"""

from epics import PV, caget
import datetime

class status(object):
    """
    联锁状态监控类
    
    该类用于监控单个通道的联锁状态，由LLRF触发。
    主要功能包括：
    1. 联锁状态监控
    2. 状态变化回调
    3. 连接状态监控
    4. 日志记录
    """
    
    @property
    def status_now(self):
        """
        获取当前联锁状态
        
        返回：
            int: 当前联锁状态值
        """
        return self.pv.get()

    @property
    def status(self):
        """
        获取联锁状态描述
        
        返回：
            str: 联锁状态描述字符串
        """
        return self.pvname+' = '+str(self.value)

    def onStatusChange(self, pvname=None, value=None, conn=None, host=None, timestamp=None, **kwargs):
        """
        联锁状态变化回调函数
        
        参数：
            pvname (str): PV名称
            value (int): 新的联锁状态值
            conn (bool): 连接状态
            host (str): 主机名
            timestamp (float): 时间戳
        """
        self.value = value
        if self.init_status is True:
            if value == 1:
                self.count += 1
                self.timestamp = timestamp
                self.callback_function()
            if (conn is False):
                # 生成PV连接丢失告警
                if self.logging is None:
                    print('ca connection status changed: ', pvname, conn, host)
                else:
                    self.logging.info('ca connection status changed:  %s %s %s', pvname, conn, host)
            else: pass
        else: pass

    def callback_function(self):
        """
        执行回调函数
        """
        if callable(self.callback):
            self.callback(self)
        else: pass

    def __init__(self, name_pv, callback=None, logging=None, *args, **kwargs):
        """
        初始化联锁状态监控对象
        
        参数：
            name_pv (tuple): (名称, PV名称)元组
            callback (function, optional): 回调函数
            logging (Logger, optional): 日志记录器
        """
        self.init_status = False
        self.logging = logging
        self.name = name_pv[0]
        self.pvname = name_pv[1]
        caget(self.pvname)
        self.pv = PV(self.pvname, callback=self.onStatusChange)
        self.count = 0  # 联锁触发计数器
        self.value = self.status_now
        self.timestamp = None
        self.callback = callback
        self.init_status = True

    def __del__(self):
        """
        析构函数，打印删除实例信息
        """
        print('Delete interlock.status instance -> '+self.pvname)

def main():
    """
    主函数（空实现）
    """
    pass

if __name__ == '__main__':
    main()
